package com.cyou.nad.datastore.query;

import javax.sql.DataSource;

import com.cyou.nad.dao.PojoPage;
import com.cyou.nad.datastore.DataList;


/**
 * jdbc 分页查询  返回JdbcPage，和PojoPage
 * 与分页标签，和迭代打table标签一起使用 能完成 sql 直接到 html table 和分页
 * @author lzm 
 */
public interface JdbcPageDao {

	/**
	 * 
	 * @param sql  sql查询语句
	 * @param values sql查询语句 预编译参数
	 * @return
	 */
	public DataList query(final String sql, final Object... values);

	/**
	 * 
	 * @param sql  sql查询语句
	 * @param values sql查询语句 预编译参数
	 * @return
	 */
	public DataList query(DataSource ds, final String sql, final Object... values);

	/**
	 * 分页查询 使用默认的数据源
	 * @param sql sql查询语句
	 * @param pageNo 从1开始的页号
	 * 				  
	 * @param pageSize 每页记录条数
	 * 					
	 * @param values sql查询语句 预编译参数
	 * @return
	 */
	public abstract JdbcPage pageQuery(final String sql, int pageNo, final int pageSize, final Object... values);

	/**
	 * 分页查询 使用默认的数据源
	 * @param sql sql查询语句
	 * @param tSql 查询出总行数的sql
	 * @param pageNo从1开始的页号
	 * @param pageSize 每页记录条数
	 * @param values  sql查询语句 预编译参数
	 * @return
	 */
	public JdbcPage pageQuery(final String sql, final String tSql, int pageNo, final int pageSize,
			final Object... values);

	/**
	 * 分页查询 使用指定的数据源
	 * @param ds 数据源
	 * @param sql  sql
	 * @param pageNo 从1开始的页号
	 * @param pageSize  每页记录条数
	 * @param values sql查询语句 预编译参数
	 * @return
	 */
	public JdbcPage pageQuery(DataSource ds, final String sql, int pageNo, final int pageSize, final Object... values);

	/**
	 * 分页查询 使用指定的数据源
	 * @param ds 
	 * @param sql sql查询语句
	 * @param tSql  查询出总行数的sql
	 * @param pageNo  从1开始的页号
	 * @param pageSize 每页记录条数
	 * @param values sql查询语句 预编译参数
	 * @return
	 */
	public JdbcPage pageQuery(DataSource ds, final String sql, final String tSql, int pageNo, final int pageSize,
			final Object... values);
	/**
	 * 分页查询 使用默认的数据源
	 * @param T pojo类型
	 * @param sql sql查询语句
	 * @param pageNo 从1开始的页号
	 * 				  
	 * @param pageSize 每页记录条数
	 * 					
	 * @param values sql查询语句 预编译参数
	 * @return
	 */
	public <T> PojoPage<T> pageQuery(Class<T> requireType,final String sql, int pageNo, final int pageSize, final Object... values);

	/**
	 * 分页查询 使用默认的数据源
	 * @param T pojo类型
	 * @param sql sql查询语句
	 * @param tSql 查询出总行数的sql
	 * @param pageNo从1开始的页号
	 * @param pageSize 每页记录条数
	 * @param values  sql查询语句 预编译参数
	 * @return
	 */
	public <T> PojoPage<T> pageQuery(Class<T> requireType,final String sql, final String tSql, int pageNo, final int pageSize,
			final Object... values);

	/**
	 * 分页查询 使用指定的数据源
	 * @param T pojo类型
	 * @param ds 数据源
	 * @param sql  sql
	 * @param pageNo 从1开始的页号
	 * @param pageSize  每页记录条数
	 * @param values sql查询语句 预编译参数
	 * @return
	 */
	public <T> PojoPage<T> pageQuery(Class<T> requireType,DataSource ds, final String sql, int pageNo, final int pageSize, final Object... values);

	/**
	 * 分页查询 使用指定的数据源
	 * @param T pojo类型
	 * @param <T>
	 * @param ds 
	 * @param sql sql查询语句
	 * @param tSql  查询出总行数的sql
	 * @param pageNo  从1开始的页号
	 * @param pageSize 每页记录条数
	 * @param values sql查询语句 预编译参数
	 * @return
	 */
	public <T> PojoPage<T> pageQuery(Class<T> requireType,DataSource ds, final String sql, final String tSql, int pageNo, final int pageSize,
			final Object... values);

}